﻿using System;
using System.Collections.Generic;
using System.Text;

namespace RAD.LightOne
{
    #region Documentation
    /// <summary>
    /// Classe que provê métodos para comparação de equvalência entre tipos no que tange a dados armazenados em 
    /// suas propriedades.
    /// </summary>
    #endregion
    internal sealed class LightTypesComparer : IComparer<Type>
    {
        #region Constructors
        public LightTypesComparer() { }
        #endregion

        #region IComparer<Type> Members

        #region Documentation
        /// <summary>
        /// Realiza uma comparação entre dois tipos onde são avaliados os dados que ambos possuem, 
        /// masmo que sejam "de fato" tipos diferentes, é analizada a tabela mais significativa no
        /// contexto, no caso a última marcada e a quntidades de campos mapeados pelas classes, que
        /// devem ser rigorozamente iguais, em sendo assim, são considerados tipos iguais.
        /// </summary>
        /// <param name="x">Tipo base da comparação.</param>
        /// <param name="y">Tipo que será comparado com o base.</param>
        /// <returns>Retornando 0 é definida a igualdade, -1 desigualdade, tabelas diferentes, -2 número de campos diferentes, -3 campos diferentes.</returns>
        #endregion
        public int Compare(Type x, Type y)
        {
            List<string> xList = new List<string>();
            xList.AddRange(MetadataReader.ExtractTables(x));
            List<string> yList = new List<string>();
            yList.AddRange(MetadataReader.ExtractTables(y));

            if (xList[xList.Count - 1] == yList[yList.Count - 1])
            {
                xList.Clear();
                yList.Clear();

                xList.AddRange(MetadataReader.ExtractAllFieldsOnHyerarchy(x));
                yList.AddRange(MetadataReader.ExtractAllFieldsOnHyerarchy(y));

                if (xList.Count == yList.Count)
                {
                    foreach(string str in xList)
                    {
                        if(!yList.Contains(str)) return -3;
                    }
                }
                else
                {
                    return -2;
                }
            }
            else
            {
                return -1;
            }

            return 0;
        }

        #endregion

    }
}
